package com.example.recyclerviewtest;

import java.lang.reflect.Field;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortUtils {

	/**
	 * 对集合进行中文拼音排序，排序依据是传入的字段名称
	 * @param <T> 泛型，泛指传入的对象类型
	 * @param list 集合，即将要排序的集合
	 * @param file 排序的依据字段
	 * @return 返回排序好的集合
	 */
	public static <T> List<T> sortForCn(List<T> list, final String file) {

		try {
			//对集合进行排序
			Collections.sort(list,new Comparator<T>() {
						@Override
						public int compare(T o1,T o2) {
							try {
								// 通过属性获取对象的属性
								Field field = o1.getClass().getDeclaredField(file);
								// 对象的属性的访问权限设置为可访问
								field.setAccessible(true);
								// 获取属性的对应的值
								String value = field.get(o1).toString();


								// 通过属性获取对象的属性
								Field fieldTwo = o2.getClass().getDeclaredField(file);
								// 对象的属性的访问权限设置为可访问
								fieldTwo.setAccessible(true);
								// 获取属性的对应的值
								String valueTwo = fieldTwo.get(o2).toString();
								// TODO Auto-generated method stub
								Comparator<Object> com = Collator.getInstance(java.util.Locale.SIMPLIFIED_CHINESE);
								return com.compare(value, valueTwo);
							}catch(Exception e) {
								System.out.println("排序失败，具体失败原因为："+e.getLocalizedMessage());
								return 0;
							}
						}
					}
			);

		} catch (Exception e) {
			System.out.println("排序失败，原因："+e.getLocalizedMessage());
			return null;
		}
		return list;
	}

	/**
	 * 对集合进行数字排序，排序依据是传入的字段名称
	 * @param <T> 泛型，泛指传入的对象类型
	 * @param list 集合，即将要排序的集合
	 * @param file 排序的依据字段
	 * @return 返回排序好的集合
	 */
	public static <T> List<T> sortForNumber(List<T> list, final String file) {

		try {
			//对集合进行排序
			Collections.sort(list,new Comparator<T>() {
						@Override
						public int compare(T o1,T o2) {
							try {
								// 通过属性获取对象的属性
								Field field = o1.getClass().getDeclaredField(file);
								// 对象的属性的访问权限设置为可访问
								field.setAccessible(true);
								// 获取属性的对应的值
								int value = Integer.parseInt(field.get(o1).toString());


								// 通过属性获取对象的属性
								Field fieldTwo = o2.getClass().getDeclaredField(file);
								// 对象的属性的访问权限设置为可访问
								fieldTwo.setAccessible(true);
								// 获取属性的对应的值
								int valueTwo = Integer.parseInt(fieldTwo.get(o2).toString());

								if(value > valueTwo) {
									return 1;
								}else if(value < valueTwo) {
									return -1;
								}else {
									return 0;
								}
							}catch(Exception e) {
								System.out.println("排序失败，具体失败原因为："+e.getLocalizedMessage());
								return 0;
							}
						}
					}
			);

		} catch (Exception e) {
			System.out.println("排序失败，原因："+e.getLocalizedMessage());
			return null;
		}
		return list;
	}

	/**
	 * 对中文集合进行排序
	 * @param list
	 * @return
	 */
	public static List<String> sortForCn(List<String> list){
		Comparator<Object> com=Collator.getInstance(java.util.Locale.SIMPLIFIED_CHINESE);
		Collections.sort(list, com);
		return list;
	}

	/**
	 * 对数组进行排序
	 * @param array
	 * @return
	 */
	public static int[] sortForNumArray(int[] array) {
		Arrays.sort(array);
		return array;
	}

	/**
	 * 对集合进行排序
	 * @param array
	 * @return
	 */
	public static List<Integer> sortForNumArray(List<Integer> array) {
		Collections.sort(array);
		return array;
	}
}
